import os
import json
import random
import time
from collections import Counter
from PyQt5.QtWidgets import (
    QDialog, QVBoxLayout, QLabel, QTextEdit, QHBoxLayout, QLineEdit, QPushButton,
    QSizePolicy, QFrame, QProgressBar, QWidget, QSpacerItem, QGridLayout
)
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt, QTimer
from openai import OpenAI
from qwen_compatible_client import QwenCompatibleClient

EMOTION_KEYWORDS = {
    "angry": ["生气", "愤怒", "火大", "恼火", "不爽", "暴躁", "想骂人", "发火", "气死", "抓狂", "怨气"],
    "sad": ["难过", "悲伤", "伤心", "沮丧", "想哭", "崩溃", "绝望", "心酸", "不开心", "低落", "委屈"],
    "happy": ["开心", "高兴", "快乐", "幸福", "满足", "愉快", "激动", "爽", "欣慰", "幸福感"],
    "fear": ["害怕", "恐惧", "担心", "焦虑", "紧张", "怕", "恐慌", "忧虑", "不安"],
    "disgust": ["厌恶", "讨厌", "嫌弃", "反感", "恶心", "嫌烦"],
    "surprise": ["惊讶", "意外", "惊喜", "震惊", "没想到", "不可思议"],
    "neutral": ["一般", "还好", "没事", "无聊", "无感", "没感觉", "平静", "平淡"]
}

EMO_MAP = {
    "angry": ("生气", "😡"),
    "disgust": ("厌恶", "🤢"),
    "fear": ("害怕", "😨"),
    "happy": ("高兴", "😄"),
    "sad": ("伤心", "😢"),
    "surprise": ("惊讶", "😲"),
    "neutral": ("平淡", "😐")
}

AUTO_RESPONSES = {
    "angry": [
        "看得出来你最近有些生气，这种情绪很正常。遇到让人生气的事情时，试着用深呼吸的方式让自己冷静下来，或者去户外走走，转移一下注意力也会有帮助。",
        "连续三次检测到你有些愤怒。也许你最近遇到了让你不顺心的事情。可以尝试和信任的人聊聊，把心里的话说出来，情绪会慢慢缓和下来。",
        "生气的时候，不要逼自己马上平静，允许自己有负面情绪。可以写写日记，记录下让你愤怒的原因，等情绪过去后再回头看看。",
        "你的情绪有些激动，或许是压力太大了。试试做些喜欢的事，比如听听音乐或者做运动，让自己放松一下。",
        "当我们遇到烦心事时，难免会发火。你可以尝试用温和的方式表达自己的不满，也许对方能更好地理解你。",
        "连续检测到你有些暴躁。你可以给自己一点独处的时间，思考一下是什么让你如此生气，然后试着慢慢接受和消化这种情绪。",
        "如果你觉得快要控制不住自己的情绪，可以尝试深呼吸五次，或者离开当前环境一会儿，给自己一点缓冲的空间。",
        "生气时不妨写下你想说的话，但先不要发出去。等一会儿，情绪稳定后再决定要不要表达，这样能避免冲动带来的遗憾。",
        "每个人都会有情绪失控的时候，别责怪自己。你能察觉到自己的生气，其实是很棒的自我觉察能力。",
        "如果你愿意，可以和我聊聊让你生气的原因。倾诉出来后，情绪往往会变得柔和一些。"
    ],
    "sad": [
        "感觉到你有些低落。难过的时候，不必强迫自己马上振作，允许自己有情绪的空间。可以试着听听舒缓的音乐，或者给自己写一封信，温柔地安慰自己。",
        "连续三次检测到你有些伤心。可以和亲密的朋友或者家人聊聊你的感受，哪怕只是静静地陪伴，也会让心情变得好一些。",
        "如果你觉得很难过，试试把情绪写下来，不需要整理逻辑，只是随意倾诉。写出来后，心里可能会轻松一点。",
        "悲伤的时候，可以给自己一些时间，不要急于走出来。偶尔流泪也是释放压力的一种方式。",
        "有时候心情不好并不是你的错，环境和压力都会影响我们的情绪。请你相信，这种感觉会慢慢过去的。",
        "和信任的人聊聊自己的心事，哪怕只是一句“我今天心情不好”，也能让你觉得不是一个人在战斗。",
        "如果你有喜欢的事情，比如画画、看电影，不妨给自己放个假，做点让自己开心的事。",
        "每个人都会有情绪低谷，不用太苛责自己。你已经很勇敢地面对自己的情绪了。",
        "难过的时候，可以回忆一下那些温暖的瞬间，让自己重新感受到生活的美好。",
        "如果你觉得孤单，请记住还有我在这里陪你。无论什么时候，你都可以和我聊天。"
    ],
    "happy": [
        "连续三次检测到你很开心，真为你感到高兴！希望你能一直保持这种愉快的心情，把快乐分享给身边的人。",
        "你的情绪很积极向上，这种状态特别棒。可以试着记录下让你开心的事情，以后心情不好时再翻出来看看。",
        "幸福其实很简单，就是在生活的小细节中发现美好。希望你能一直拥有这种发现快乐的能力。",
        "和朋友、家人一起分享你的好心情，会让快乐加倍哦。你可以把今天开心的事讲给他们听。",
        "你最近的情绪很阳光。试着把这种正能量带给他人，也会让自己更快乐。",
        "每当感到开心的时候，不妨奖励自己一下，这也是对努力生活的肯定。",
        "如果你有什么开心的事情，欢迎和我一起分享。你的快乐会让我也觉得温暖。",
        "好心情是最美的礼物，记得珍惜当下的幸福。生活中还有很多值得期待的小确幸。",
        "保持对生活的热爱和好奇心，你会发现越来越多让你开心的理由。",
        "能够连续保持愉快的心情，说明你正在很好地管理自己的情绪，给自己点个赞吧！"
    ],
    "fear": [
        "最近你似乎有些担心或害怕。遇到未知或不确定的事情时，感到焦虑很正常。可以试着深呼吸，给自己积极的心理暗示。",
        "连续三次检测到你有些紧张。你可以和朋友聊聊自己的担忧，把内心的压力释放出来，也可以做做运动来转移注意力。",
        "每个人都会有害怕的时候。你可以写下让你害怕的事情，然后试着逐条分析，也许会发现其实没有想象中那么可怕。",
        "焦虑的时候，可以尝试进行冥想或放松训练，这些方法有助于让大脑和身体都慢慢平静下来。",
        "如果你担心未来，不妨把注意力集中在当下，做好眼前的每一件小事。",
        "和他人分享你的忧虑，往往能获得意想不到的安慰与支持，不要一个人扛着。",
        "害怕的时候，可以给自己一些积极的心理暗示，比如“我已经尽力了，一切都会好起来”。",
        "有些事情并没有我们想象得那么糟糕，勇敢去面对，可能比你担心的要容易许多。",
        "你已经很勇敢地面对自己的恐惧了。给自己一点耐心和鼓励，慢慢来。",
        "如果你愿意，可以和我聊聊让你焦虑的原因，我会一直陪着你。"
    ],
    "disgust": [
        "感觉你最近有些厌烦或反感。遇到让自己不舒服的事情时，可以尝试转移注意力，做一些自己喜欢的事情来缓解。",
        "连续三次检测到你有点反感。你可以把让你不舒服的事情写出来，这样有助于理清思绪，也许会有新的发现。",
        "有时候我们会对人或事产生厌恶，这很正常。你可以给自己多一些宽容，允许自己有这样的情绪。",
        "如果觉得周围环境让你不愉快，不妨暂时离开一下，给自己一个安静的空间。",
        "厌恶的情绪可能和压力或疲劳有关，适当休息一下，说不定会有好转。",
        "当你发现自己讨厌某件事时，可以试着换个角度思考，说不定会有不同的感受。",
        "和朋友聊聊你的感受，他们也许有类似的经历，可以给你一些建议或者安慰。",
        "不要因为有负面情绪而自责，每个人都会有讨厌的时刻，接纳自己很重要。",
        "做一些让自己放松的活动，比如散步、画画，有助于缓解内心的不适。",
        "如果你想聊聊具体的事情，可以告诉我，我会耐心听你倾诉。"
    ],
    "surprise": [
        "最近你似乎经常感到惊讶。生活的确充满了各种意外和惊喜，希望这些变化大多是美好的体验。",
        "连续三次检测到你有些惊喜。或许你遇到了一些新鲜事物，可以把有趣的经历和我分享一下。",
        "面对意外时，保持好奇心和积极的心态会让你收获更多成长。",
        "有时候突如其来的事情会让我们措手不及，但也可能带来新的机会和可能性。",
        "惊讶的情绪提醒我们，生活还有很多未知和可能性，愿你能以平和的心态迎接每一个变化。",
        "如果你遇到什么让你觉得不可思议的事，不妨记录下来，或许将来回忆时会觉得有趣。",
        "生活中的小惊喜往往能带来快乐，保持对生活的好奇和热情吧。",
        "面对意外，也许会有点措手不及，但相信自己的应变能力，一切都会变好。",
        "和朋友分享你的新奇体验，他们可能会给你更多正面的反馈和支持。",
        "不论是好是坏，每一次惊讶都是成长的一部分。希望你能享受这个过程。"
    ],
    "neutral": [
        "你最近的情绪比较平稳，这是一种很好的状态。平淡的日子，有时也是最珍贵的时光。",
        "连续三次检测到你的情绪较为平和。可以利用这段时间做些规划，或者培养新的兴趣爱好。",
        "平淡并不代表无聊，有时候正是这些平静的时刻，让我们积蓄能量迎接未来的挑战。",
        "你现在的心态很平和，说明你对生活有很好的掌控感。继续保持，相信会有更多美好的事情发生。",
        "如果觉得生活有些单调，不妨尝试一些新鲜的事物，让自己有新的体验和收获。",
        "平淡的生活中，也可以发现很多美好。比如一顿美味的饭菜，一次悠闲的散步。",
        "情绪平稳的时候，是调整和自我提升的好时机。可以给自己定个小目标，慢慢实现。",
        "不要觉得平淡就是不好，其实这是一种幸福。享受当下的宁静和安逸吧。",
        "如果你对生活有新的想法或计划，可以和我一起讨论，我很愿意听你的故事。",
        "有时候平凡就是最大的幸福。愿你每天都能感受到生活的温暖和安静。"
    ],
    "wave": [
        "你的情绪最近波动比较大，说明你对自己的感受很敏感。遇到情绪变化时，不妨写写日记，或者和朋友聊聊，帮助自己梳理思绪。",
        "检测到你连续三次情绪不同，情绪起伏很正常。可以尝试做一些放松的活动，比如听音乐或运动，帮助情绪回归平稳。",
        "情绪波动是一种信号，提示我们需要关注自己的内心。不要害怕这样的变化，允许自己经历各种感受。",
        "情绪像潮水，有高有低。当你感到不稳定时，给自己一点空间和时间，慢慢调整心态。",
        "情绪的波动也许和最近的生活压力有关，你可以尝试和亲密的人沟通下，让他们了解你的感受。",
        "有时候我们会因为外界变化而情绪起伏，不妨给自己一些积极的心理暗示，一切都会慢慢好起来。",
        "多关注自己的情绪变化，记录下来，久而久之你会发现其中的规律，也更容易调节自己。",
        "情绪的波动说明你是一个很有感受力的人，这其实是一种宝贵的能力。学会和情绪共处，会让你更强大。",
        "如果你觉得情绪难以自控，可以尝试做深呼吸练习，或暂时离开让你压力大的环境。",
        "无论你的情绪如何变化，我都会在这里陪着你。如果需要倾诉，随时和我说说你的心情。"
    ]
}

class SimpleSelfLearningEngine:
    def __init__(self, advice_file="advice_feedback.json"):
        self.advice_file = advice_file
        self.advice_memory = {}
        self.load()
    def load(self):
        if os.path.exists(self.advice_file):
            try:
                with open(self.advice_file, "r", encoding="utf-8") as f:
                    self.advice_memory = json.load(f)
            except Exception:
                self.advice_memory = {}
    def save(self):
        try:
            with open(self.advice_file, "w", encoding="utf-8") as f:
                json.dump(self.advice_memory, f, ensure_ascii=False, indent=2)
        except Exception:
            pass
    def record_feedback(self, advice, feedback):
        mem = self.advice_memory.setdefault(advice, {'positive': 0, 'negative': 0})
        if feedback == "positive":
            mem['positive'] += 1
        else:
            mem['negative'] += 1
        self.save()
    def get_quality(self, advice):
        mem = self.advice_memory.get(advice, {'positive': 0, 'negative': 0})
        total = mem['positive'] + mem['negative']
        if total == 0: return 0.5
        return mem['positive'] / total
    def suggest_better_advice(self, advice):
        quality = self.get_quality(advice)
        if quality < 0.4:
            return "看来之前的建议可能还不够贴心。每个人都会有难过或者烦躁的时候，试着用写日记或和朋友聊一聊，都会有帮助。"
        return None

def detect_emotion(user_text):
    text = user_text.lower()
    match = {emo: 0 for emo in EMOTION_KEYWORDS}
    for emo, keywords in EMOTION_KEYWORDS.items():
        for kw in keywords:
            if kw in user_text:
                match[emo] += 1
    if max(match.values()) > 0:
        return max(match, key=lambda k: match[k])
    if "烦" in text or "难受" in text or "气" in text:
        return "angry"
    if "想哭" in text or "崩溃" in text or "不想活" in text:
        return "sad"
    if "怕" in text or "焦虑" in text:
        return "fear"
    if "开心" in text or "高兴" in text or "喜欢" in text:
        return "happy"
    if "讨厌" in text or "恶心" in text:
        return "disgust"
    if "惊" in text or "意外" in text:
        return "surprise"
    return "neutral"

class EmotionStateWidget(QFrame):
    def __init__(self, emotions, parent=None):
        super().__init__(parent)
        self.setStyleSheet("background: #e6f8ee; border-radius: 15px;")
        self.emotions = emotions
        self.emo_labels = []
        self.emo_bars = []
        self.emo_emojis = []
        self.initUI()
    def initUI(self):
        layout = QVBoxLayout(self)
        layout.setSpacing(14)
        layout.setContentsMargins(18, 18, 18, 18)
        title = QLabel("实时情绪状态")
        title.setFont(QFont("Comic Sans MS", 22, QFont.Bold))
        title.setStyleSheet("color: #17b078;")
        layout.addWidget(title)
        for emo in self.emotions:
            row = QHBoxLayout()
            emoji = QLabel(EMO_MAP[emo][1])
            emoji.setFont(QFont("Arial", 18))
            emoji.setFixedWidth(36)
            self.emo_emojis.append(emoji)
            label = QLabel(EMO_MAP[emo][0])
            label.setFont(QFont("Comic Sans MS", 15))
            label.setFixedWidth(48)
            self.emo_labels.append(label)
            bar = QProgressBar()
            bar.setMaximum(100)
            bar.setMinimum(0)
            bar.setValue(0)
            bar.setFixedHeight(18)
            bar.setStyleSheet("""
                QProgressBar {
                    border: 1px solid #b2e4c9; border-radius: 8px; background: #ffffff;
                }
                QProgressBar::chunk {
                    background-color: #17b078;
                    border-radius: 8px;
                }
            """)
            self.emo_bars.append(bar)
            row.addWidget(emoji)
            row.addWidget(label)
            row.addWidget(bar, 1)
            layout.addLayout(row)
        layout.addSpacing(12)
    def update_probs(self, probs):
        for i, emo in enumerate(self.emotions):
            v = int(min(max(probs.get(emo, 0), 0), 100))
            self.emo_bars[i].setValue(v)

class MindReportDialog(QDialog):
    def __init__(self, summary, parent=None):
        super().__init__(parent)
        self.setWindowTitle("心理报告")
        self.setMinimumSize(480, 460)
        self.setStyleSheet("""
            QDialog {background-color: #e6f8ee;}
            QLabel, QTextEdit {color: #1e3b2e; font-family: '微软雅黑', 'Comic Sans MS', Arial;}
        """)
        layout = QVBoxLayout(self)
        layout.setContentsMargins(36, 36, 36, 36)
        layout.setSpacing(22)
        title = QLabel("🌿 心理报告")
        title.setFont(QFont("Comic Sans MS", 26, QFont.Bold))
        title.setStyleSheet("color:#219970;")
        layout.addWidget(title, alignment=Qt.AlignHCenter)
        box = QTextEdit()
        box.setReadOnly(True)
        box.setFont(QFont("微软雅黑", 17))
        box.setStyleSheet("""
            background: #eafbe5;
            border-radius: 16px;
            padding: 16px;
            color: #1e3b2e;
            font-family: '微软雅黑', 'Comic Sans MS', Arial;
        """)
        box.setText(summary)
        layout.addWidget(box, 1)


class AIChatDialog(QDialog):
    def __init__(self, emotion_history, feedback_engine, parent=None,client=None, username="你", initial_emotion="neutral"):
        super().__init__(parent)
        self.setWindowTitle("AI 实时沟通")
        self.setMinimumSize(1200, 700)
        self.setStyleSheet("""
            QDialog {background-color: #eafaf2;}
            QLabel, QTextEdit, QLineEdit {color: #222; font-family: '微软雅黑', Arial;}
            QPushButton {
                background-color: #2edc9a; color: #fff; border-radius: 10px; padding: 8px 16px;
                font-size: 22px;
            }
            QPushButton:hover {
                background-color: #43f0b0;
            }
        """)
        self.emotion_history = list(emotion_history)
        self.feedback_engine = feedback_engine
        self.trend = None
        self.last_advice = ""
        self.user_input = ""
        self.last_emotion = self.emotion_history[-1] if self.emotion_history else None
        self.username = username
        self.initial_emotion = initial_emotion
        self.current_probs = {k: 0 for k in EMO_MAP}
        self.last_auto_response = {emo: None for emo in AUTO_RESPONSES}
        self.initUI()
        self.client = client
        self.start_chat()
        self.auto_check_timer = QTimer(self)
        self.auto_check_timer.timeout.connect(self.auto_emotion_response)
        self.auto_check_timer.start(1000)
        self.last_auto_emotion_trigger = None
    def initUI(self):
        main_layout = QVBoxLayout(self)
        main_layout.setSpacing(0)
        main_layout.setContentsMargins(16, 16, 16, 16)
        center_layout = QHBoxLayout()
        center_layout.setSpacing(18)
        center_layout.setContentsMargins(0, 0, 0, 0)
        left_panel = QFrame()
        left_panel.setStyleSheet("background: #d3f5e6; border-radius: 16px;")
        left_layout = QVBoxLayout(left_panel)
        left_layout.setContentsMargins(18, 18, 18, 18)
        left_layout.setSpacing(14)
        title = QLabel("🤖 AI 心理沟通助理")
        title.setFont(QFont("Comic Sans MS", 32, QFont.Bold))
        title.setAlignment(Qt.AlignCenter)
        left_layout.addWidget(title)
        self.chat_display = QTextEdit()
        self.chat_display.setReadOnly(True)
        self.chat_display.setFont(QFont("微软雅黑", 18))
        self.chat_display.setStyleSheet("background-color: #e1f8ee; border-radius: 12px; padding: 16px; color:#222;")
        left_layout.addWidget(self.chat_display, 2)
        input_layout = QHBoxLayout()
        self.input_edit = QLineEdit()
        self.input_edit.setPlaceholderText("请输入你的想法或回复...")
        self.input_edit.setFont(QFont("微软雅黑", 18))
        self.input_edit.setStyleSheet(
            "background-color: #fff; color: #222; border-radius: 10px; padding: 10px;"
        )
        input_layout.addWidget(self.input_edit, 2)
        self.btn_send = QPushButton("发送")
        self.btn_send.setFont(QFont("微软雅黑", 18, QFont.Bold))
        self.btn_send.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.btn_send.setStyleSheet("""
            QPushButton {
                background-color: #2edc9a; color: #fff; border-radius: 16px; padding: 16px 36px; font-size: 22px;
            }
            QPushButton:hover {
                background-color: #43f0b0;
            }
        """)
        self.btn_send.clicked.connect(self.user_send)
        input_layout.addWidget(self.btn_send, 1)
        left_layout.addLayout(input_layout)
        feedback_layout = QHBoxLayout()
        self.like_btn = QPushButton("👍 有帮助")
        self.like_btn.setFont(QFont("微软雅黑", 15))
        self.like_btn.setStyleSheet("""
            QPushButton {background-color: #e1f8ee; color: #17b078; border-radius: 10px;}
            QPushButton:hover {background-color: #c7f6e2;}
        """)
        self.like_btn.clicked.connect(lambda: self.user_feedback("positive"))
        self.dislike_btn = QPushButton("👎 没帮助")
        self.dislike_btn.setFont(QFont("微软雅黑", 15))
        self.dislike_btn.setStyleSheet("""
            QPushButton {background-color: #fbeee6; color: #d96f6e; border-radius: 10px;}
            QPushButton:hover {background-color: #ffd1cc;}
        """)
        self.dislike_btn.clicked.connect(lambda: self.user_feedback("negative"))
        feedback_layout.addStretch(1)
        feedback_layout.addWidget(self.like_btn)
        feedback_layout.addWidget(self.dislike_btn)
        left_layout.addLayout(feedback_layout)
        left_layout.addStretch()
        center_layout.addWidget(left_panel, 2)
        right_panel = QFrame()
        right_panel.setStyleSheet("background: #e6f8ee; border-radius: 16px;")
        right_layout = QVBoxLayout(right_panel)
        right_layout.setContentsMargins(22, 24, 22, 24)
        right_layout.setSpacing(18)
        self.emotions = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"]
        self.state_widget = EmotionStateWidget(self.emotions)
        right_layout.addWidget(self.state_widget, 0)
        right_layout.addStretch()
        center_layout.addWidget(right_panel, 1)
        main_layout.addLayout(center_layout)
        main_layout.addItem(QSpacerItem(10, 24, QSizePolicy.Minimum, QSizePolicy.Expanding))
        btn_bottom_widget = QWidget()
        btn_bottom_widget.setStyleSheet("background:transparent;")
        btn_bottom_layout = QGridLayout(btn_bottom_widget)
        btn_bottom_layout.setContentsMargins(0, 16, 0, 0)
        btn_bottom_layout.setHorizontalSpacing(60)
        btn_bottom_layout.setVerticalSpacing(24)
        self.btn_salon = QPushButton("心理沙龙")
        self.btn_salon.setFont(QFont("微软雅黑", 22, QFont.Bold))
        self.btn_salon.setFixedHeight(56)
        self.btn_salon.setFixedWidth(260)
        self.btn_salon.setStyleSheet("""
            QPushButton {
                background-color: #2edc9a; color: #fff; border-radius: 16px; padding: 12px 36px; font-size: 22px;
            }
            QPushButton:hover {
                background-color: #43f0b0;
            }
        """)
        self.btn_salon.clicked.connect(self.on_salon_clicked)
        btn_bottom_layout.addWidget(self.btn_salon, 0, 0)
        self.btn_fun = QPushButton("趣味游戏")
        self.btn_fun.setFont(QFont("微软雅黑", 22, QFont.Bold))
        self.btn_fun.setFixedHeight(56)
        self.btn_fun.setFixedWidth(260)
        self.btn_fun.setStyleSheet("""
            QPushButton {
                background-color: #2edc9a; color: #fff; border-radius: 16px; padding: 12px 36px; font-size: 22px;
            }
            QPushButton:hover {
                background-color: #43f0b0;
            }
        """)
        self.btn_fun.clicked.connect(self.on_fun_clicked)
        btn_bottom_layout.addWidget(self.btn_fun, 0, 1)
        self.btn_suicide = QPushButton("我想自杀")
        self.btn_suicide.setFont(QFont("微软雅黑", 22, QFont.Bold))
        self.btn_suicide.setFixedHeight(56)
        self.btn_suicide.setFixedWidth(260)
        self.btn_suicide.setStyleSheet("""
            QPushButton {
                background-color: #e65151; color: #fff; border-radius: 16px; padding: 12px 36px; font-size: 22px; font-weight:bold;
            }
            QPushButton:hover {
                background-color: #fd7979;
            }
        """)
        self.btn_suicide.clicked.connect(self.on_suicide_clicked)
        btn_bottom_layout.addWidget(self.btn_suicide, 1, 0)
        self.btn_exit = QPushButton("退出")
        self.btn_exit.setFont(QFont("微软雅黑", 22, QFont.Bold))
        self.btn_exit.setFixedHeight(56)
        self.btn_exit.setFixedWidth(260)
        self.btn_exit.setStyleSheet("""
            QPushButton {
                background-color: #4e5458; color: #fff; border-radius: 16px; padding: 12px 36px; font-size: 22px; font-weight:bold;
            }
            QPushButton:hover {
                background-color: #a6aeb5;
            }
        """)
        self.btn_exit.clicked.connect(self.close)
        btn_bottom_layout.addWidget(self.btn_exit, 1, 1)
        main_layout.addWidget(btn_bottom_widget, alignment=Qt.AlignBottom)
        self.setLayout(main_layout)

    def ask_deepseek_ai(self, user_text, detected_emotion, emotion_summary, api_prompt_override=None):
        if api_prompt_override is not None:
            history = [
                {"role": "system", "content": api_prompt_override},
                {"role": "user", "content": user_text}
            ]
        else:
            history = [
                {"role": "system", "content": (
                    "你是一个专业的心理健康AI助理。"
                    "你要根据用户最近动态检测到的情绪（如：" + detected_emotion + "），"
                    "以及如下的近期情绪趋势分析：" + emotion_summary +
                    "，结合用户的最新发言，给出共情、安慰、鼓励和实际建议，"
                    "务必体现对情绪的理解和针对性。"
                    "请勿重复用户的话，不要太模式化，回复尽量自然、简洁、温暖。"
                )},
                {"role": "user", "content": user_text}
            ]
        try:
            response = self.client.chat.completions.create(
                model="myqwen",
                messages=history,
                stream=False
            )
            return response.choices[0].message.content.strip()
        except Exception as e:
            return "很抱歉，AI未能及时回复。请稍后再试。\n（技术原因：" + str(e) + "）"

    def start_chat(self):
        analysis, advice, style = self.psychological_analysis_and_communication(self.emotion_history)
        self.trend = style
        self.last_advice = advice
        self.append_chat("AI", analysis, style)
        self.append_chat("AI", advice, style)
        self.update_emotion_state_from_history()
    def update_emotion_state_from_history(self):
        cnt = Counter(self.emotion_history)
        total = len(self.emotion_history)
        probs = {emo: 0 for emo in self.emotions}
        if total > 0:
            for emo in self.emotions:
                probs[emo] = int(cnt[emo] / total * 100)
        self.state_widget.update_probs(probs)
        self.current_probs = probs

    def append_chat(self, who, msg, style="neutral"):
        color = {"positive": "#17b078", "negative": "#e57373", "neutral": "#f2c744"}
        prefix = "AI" if who == "AI" else self.username
        self.chat_display.append(f"<b style='color: {color.get(style, '#222')}'>{prefix}：</b> {msg}")
        # ----------- 记录对话历史 --------------
        # 若parent有session_chat_history属性则记录对话
        if hasattr(self.parent(), 'session_chat_history'):
            import datetime
            self.parent().session_chat_history.append(
                (who, msg, datetime.datetime.now().strftime("%H:%M:%S"))
            )
    def user_send(self):
        text = self.input_edit.text().strip()
        if not text:
            return
        self.append_chat("User", text, "neutral")
        detected_emotion = detect_emotion(text)
        emotion_summary, _, _ = self.psychological_analysis_and_communication(self.emotion_history[-5:])
        ai_reply = self.ask_deepseek_ai(text, detected_emotion, emotion_summary)
        self.append_chat("AI", ai_reply, self.trend)
        self.emotion_history.append(detected_emotion)
        if len(self.emotion_history) > 20:
            self.emotion_history.pop(0)
        self.last_emotion = detected_emotion
        self.last_advice = ai_reply
        self.input_edit.clear()
        self.update_emotion_state_from_history()
        self.auto_emotion_response()
    def user_feedback(self, feedback):
        self.feedback_engine.record_feedback(self.last_advice, feedback)
        if feedback == "positive":
            msg = "很高兴我的建议对你有帮助！"
        else:
            alt = self.feedback_engine.suggest_better_advice(self.last_advice)
            msg = alt or "谢谢你的反馈，我会不断学习给出更适合你的建议。"
        self.append_chat("AI", msg, "positive" if feedback == "positive" else "negative")
    def update_emotion_trend(self, emotion_history):
        self.emotion_history = list(emotion_history)
        self.update_emotion_state_from_history()
        _, _, style = self.psychological_analysis_and_communication(emotion_history)
        if style != self.trend:
            if style == "positive":
                tip = "你最近的情绪变得更加积极，真棒！"
            elif style == "negative":
                tip = "我注意到你最近的情绪有些低落，希望我的建议能帮到你。"
            else:
                tip = "你的情绪趋于平稳，我会继续陪伴你。"
            self.append_chat("AI", tip, style)
            self.trend = style
    def psychological_analysis_and_communication(self, emotion_history):
        emo_map = {
            "angry": "生气", "disgust": "厌恶", "fear": "害怕",
            "happy": "高兴", "sad": "伤心", "surprise": "惊讶", "neutral": "平淡"
        }
        cnt = Counter(emotion_history)
        total = len(emotion_history)
        if not emotion_history:
            return (
                "暂未检测到有效的表情数据，建议先进行实时识别。",
                "你好！请尝试通过摄像头进行表情识别，我们会根据你的情绪为你提供建议。",
                "neutral"
            )
        dominant, dominant_count = cnt.most_common(1)[0]
        pct = dominant_count / total * 100 if total else 0
        style = "neutral"
        if dominant == "happy":
            analysis = f"最近你大多数时间都表现为『{emo_map[dominant]}』({pct:.0f}%)，说明你的情绪较为积极。"
            advice = "保持愉快的心情很好！继续保持积极乐观的态度，有什么开心的事情可以和我分享哦。"
            style = "positive"
        elif dominant == "sad":
            analysis = f"最近你以『{emo_map[dominant]}』({pct:.0f}%)为主，可能心情有些低落。"
            advice = "遇到不开心的事情时，不妨试着和朋友聊聊或出去走走，希望你能早日恢复好心情。如果需要倾诉，我一直在这里。"
            style = "negative"
        elif dominant == "angry":
            analysis = f"你最近多次表现出『{emo_map[dominant]}』({pct:.0f}%)，或许遇到让你不满或烦躁的事。"
            advice = "深呼吸，试着放松一下。遇到不顺心的事，可以尝试做做运动或者听听音乐，让自己冷静下来。"
            style = "negative"
        elif dominant == "fear":
            analysis = f"你最近较多的表情是『{emo_map[dominant]}』({pct:.0f}%)，可能有些焦虑或担忧。"
            advice = "每个人都会有担心的时候，可以尝试和朋友或家人谈谈你的想法，也可以写下来帮助缓解压力。"
            style = "negative"
        elif dominant == "disgust":
            analysis = f"最近你表现出较多『{emo_map[dominant]}』({pct:.0f}%)，也许有些事让你感到不适。"
            advice = "如果遇到让你反感的事情，不妨转移一下注意力，做些喜欢的事情让自己放松一下。"
            style = "negative"
        elif dominant == "surprise":
            analysis = f"你的表情以『{emo_map[dominant]}』({pct:.0f}%)为主，最近可能有不少新鲜或意外的事情发生。"
            advice = "生活充满惊喜，希望这些惊讶大多是好的体验。保持好奇心，享受每一个小惊喜吧！"
            style = "positive"
        else:
            analysis = f"你的情绪多为『{emo_map.get(dominant, dominant)}』({pct:.0f}%)，整体现状较为平稳。"
            advice = "平淡是一种幸福，愿你每天都能拥有安稳平静的心情。如果有想聊的事情，也可以随时告诉我。"
            style = "neutral"
        negative = ["sad", "angry", "disgust", "fear"]
        neg_count = sum(cnt[x] for x in negative)
        if neg_count / total > 0.6 and total >= 5:
            analysis += "\n注意：你近期消极情绪比例较高，建议关注自己的心理健康。"
            advice = "如果有压力或烦恼，可以尝试寻求家人、朋友或专业人士的帮助。健康的情绪管理非常重要。"
            style = "negative"
        return analysis, advice, style
    def get_local_advice(self, emotion):
        lst = AUTO_RESPONSES.get(emotion, AUTO_RESPONSES["neutral"])
        last = self.last_auto_response.get(emotion, None)
        candidates = [txt for txt in lst if txt != last]
        if not candidates:
            txt = random.choice(lst)
        else:
            txt = random.choice(candidates)
        self.last_auto_response[emotion] = txt
        return txt
    def auto_emotion_response(self):
        now = time.time()
        if self.last_auto_emotion_trigger and now - self.last_auto_emotion_trigger < 30:
            return
        if len(self.emotion_history) >= 3:
            last3 = self.emotion_history[-3:]
            if last3[0] == last3[1] == last3[2]:
                response = self.get_local_advice(last3[0])
                self.append_chat("AI", response, "neutral")
                self.last_auto_emotion_trigger = now
            elif len(set(last3)) == 3:
                response = self.get_local_advice("wave")
                self.append_chat("AI", response, "neutral")
                self.last_auto_emotion_trigger = now
    def on_salon_clicked(self):
        prompt = (
            "你现在是一个温暖的心理健康故事讲述者。请根据用户的近期聊天内容，"
            "编一个短小真实的心理治愈故事，用故事引导用户表达和宣泄自己的心理情绪。"
            "故事要贴近生活，富有共情力，结尾可以温柔地鼓励用户说出自己的想法和感受。"
        )
        last_user_msg = ""
        for i in reversed(range(self.chat_display.document().blockCount())):
            text = self.chat_display.document().findBlockByNumber(i).text()
            if text.startswith(self.username + "：") or text.startswith(self.username + ":"):
                last_user_msg = text[len(self.username)+1:].strip()
                break
        story = self.ask_deepseek_ai(last_user_msg, "neutral", "", api_prompt_override=prompt)
        self.append_chat("AI", story, "neutral")
    def on_suicide_clicked(self):
        prompt = (
            "你是专业心理危机干预AI。用户表达了自杀想法。请你用极其温柔、理解和关怀的语言，"
            "先承认用户的痛苦和感受，再讲述一个真实或虚构的温暖故事，帮助用户宣泄情绪，"
            "最后引导用户主动表达自己的想法，并鼓励其寻求家人/朋友/心理医生的帮助。"
            "请勿刺激用户，不可使用任何负面或命令性语言，回复要简洁温暖。"
        )
        last_user_msg = ""
        for i in reversed(range(self.chat_display.document().blockCount())):
            text = self.chat_display.document().findBlockByNumber(i).text()
            if text.startswith(self.username + "：") or text.startswith(self.username + ":"):
                last_user_msg = text[len(self.username)+1:].strip()
                break
        story = self.ask_deepseek_ai(last_user_msg, "sad", "", api_prompt_override=prompt)
        self.append_chat("AI", story, "negative")
    def on_fun_clicked(self):
        current_emotion = self.emotion_history[-1] if self.emotion_history else "neutral"
        emotion_summary, _, _ = self.psychological_analysis_and_communication(self.emotion_history[-5:])
        chat_history = []
        for i in range(self.chat_display.document().blockCount()):
            text = self.chat_display.document().findBlockByNumber(i).text()
            if text:
                chat_history.append(text)
        recent_user_msgs = [msg for msg in chat_history if msg.startswith(self.username + "：") or msg.startswith(self.username + ":")]
        last_user_msg = recent_user_msgs[-1][len(self.username)+1:].strip() if recent_user_msgs else ""
        prompt = (
            "你是一个专业的心理健康AI助理和心理趣味小游戏设计师。"
            "现在请根据如下信息为用户量身定制一个简单易操作、科学有效且充满趣味的心理小游戏，"
            "小游戏要能引导缓解用户当前情绪和压力，结合心理学知识、认知行为疗法、正念、表达性艺术疗法等理论。"
            "要求：\n"
            "1. 游戏内容要有明确步骤和完成方式，简单易懂，最好能让用户当场操作。\n"
            "2. 要结合用户【初始选择的情绪】：" + EMO_MAP.get(self.initial_emotion, (self.initial_emotion,))[0] +
            "，以及【当前检测到的情绪】：" + EMO_MAP.get(current_emotion, (current_emotion,))[0] +
            "，\n3. 还要分析下方用户最近的聊天内容和情绪趋势：\n" + emotion_summary +
            "\n用户最近发言举例：" + (last_user_msg if last_user_msg else "无") +
            "\n4. 游戏类型包括但不限于：正念冥想、情绪绘画、呼吸训练、积极回忆、希望瓶、想法重构、身体舒展、音乐放松等。\n"
            "5. 结尾用温暖的语言鼓励用户分享游戏体验。\n"
            "请用分步编号形式输出，开头写上小游戏的名字。"
        )
        game = self.ask_deepseek_ai(last_user_msg, current_emotion, emotion_summary, api_prompt_override=prompt)
        self.append_chat("AI", game, "neutral")

    def get_key_session_summary(self, max_turns=8):
        """
        获取本次会话的关键摘要内容，返回[(who, msg, timestamp), ...]
        """
        chat_hist = getattr(self.parent(), "session_chat_history", [])
        important = []
        for who, msg, ts in chat_hist:
            if who == "AI" or len(msg) > 16:
                important.append((who, msg, ts))
        if len(important) > max_turns:
            return important[:max_turns // 2] + important[-max_turns // 2:]
        return important
    def closeEvent(self, event):
        if hasattr(self, 'on_report_clicked'):
           self.on_report_clicked()
        event.accept()